#include <stdio.h>
#include <stdlib.h>
#include "algorithm.h"

/**
 * @brief  算法接口
 * @param  input            输入参数
 * @param  output           输出参数
 * @return int32_t          返回成功或者失败，RETURN_OK 或 RETURN_ERROR
 */
int32_t IOScheduleAlgorithm(const InputParam *input, OutputParam *output)
{
    int32_t ret; 
    /* 算法示例：先入先出算法 */
    output->len = input->ioVec.len;
    int32_t *visit = (int *)malloc(output->len * sizeof(int));
    if (visit == NULL) {
        return RETURN_ERROR; // 内存分配失败
    }
    HeadInfo now;//当前磁头位置
    now=input->headInfo;//初始化为磁头初始位置
    for (uint32_t i = 0; i < output->len; i++) {
        visit[i] = 0;
    }
    for (uint32_t i = 0; i < output->len; i++){//贪心算法
        int mintime=0x3f3f3f3f;
        int minj=-1;
        for (uint32_t j = 0; j < output->len; j++){
            if (visit[j])
                continue;
            else{
                HeadInfo end = {input->ioVec.ioArray[j].wrap, input->ioVec.ioArray[j].startLpos, HEAD_RW};
                int32_t seekT = SeekTimeCalculate(&now, &end);
                if(seekT<mintime){
                    mintime=seekT;
                    minj=j;
                }
            }
        }
        if (minj == -1) {
            // 错误处理：所有请求都已访问
            return RETURN_ERROR;
        }
        visit[minj]=1;
        HeadInfo end = {input->ioVec.ioArray[minj].wrap, input->ioVec.ioArray[minj].endLpos, HEAD_RW};
        now=end;
        output->sequence[i]=input->ioVec.ioArray[minj].id;
    }
    
    return RETURN_OK;
}

/**
 * @brief  算法运行的主入口
 * @param  input            输入参数
 * @param  output           输出参数
 * @return uint32_t          返回成功或者失败，RETURN_OK 或 RETURN_ERROR
 */
int32_t AlgorithmRun(const InputParam *input, OutputParam *output)
{
    int32_t ret;

    ret = IOScheduleAlgorithm(input, output);

    return RETURN_OK;
}
